cmake_minimum_required(VERSION 3.20)
project(gb_client CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_VERBOSE_MAKEFILE ON)

# --- 寻找依赖 ---
find_package(OpenCV REQUIRED)
find_package(PkgConfig REQUIRED)

# --- FFmpeg ---
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET libavcodec libavformat libavutil libswscale)

# --- 定义 PJSIP IMPORTED 目标 ---
# 这是解决此问题的关键。我们将创建一个"虚拟"的CMake目标来代表PJSIP。
# 然后，我们将PJSIP所需的所有信息（包含目录、库、编译标志、链接标志）
# 都附加到这个虚拟目标上。
add_library(pjproject_custom_target INTERFACE)

# 使用 pkg-config 获取 PJSIP 的所有编译和链接信息
pkg_check_modules(PJSIP_PC REQUIRED libpjproject)

# 获取 PJSIP 的所有依赖库，包括那些"私有"的系统库和框架
# 这是最关键的一步，之前的尝试都忽略了这里
execute_process(
  COMMAND ${PKG_CONFIG_EXECUTABLE} --libs --static libpjproject
  OUTPUT_VARIABLE PJSIP_STATIC_LIBS
  OUTPUT_STRIP_TRAILING_WHITESPACE
)

# 获取编译标志
execute_process(
  COMMAND ${PKG_CONFIG_EXECUTABLE} --cflags libpjproject
  OUTPUT_VARIABLE PJSIP_CFLAGS
  OUTPUT_STRIP_TRAILING_WHITESPACE
)

# 将获取到的信息设置到我们的虚拟目标上
# separate_arguments 用于将字符串(-L... -l... -framework...)拆分成列表
separate_arguments(PJSIP_CFLAGS_LIST NATIVE_COMMAND "${PJSIP_CFLAGS}")
# 将空格分隔的链接标志字符串转换为 CMake 列表（分号分隔）
string(REPLACE " " ";" PJSIP_LIBS_LIST "${PJSIP_STATIC_LIBS}")

set_target_properties(pjproject_custom_target PROPERTIES
  INTERFACE_COMPILE_OPTIONS "${PJSIP_CFLAGS_LIST}"
  INTERFACE_INCLUDE_DIRECTORIES "${PJSIP_PC_INCLUDE_DIRS}"
  INTERFACE_LINK_LIBRARIES "${PJSIP_LIBS_LIST}"
)


# --- 定义我们的可执行文件 ---
add_executable(gb_client main.cpp)

# --- 链接库 ---
# 现在链接变得非常干净，只需链接到 OpenCV 和我们定义的 PJSIP 目标即可
target_link_libraries(gb_client PRIVATE
  ${OpenCV_LIBS}
  pjproject_custom_target
  PkgConfig::FFMPEG
) 